package serverApp.threads;

import java.io.*;
import java.net.*;
import java.util.*;

import netInterfaces.*;

public class ReceivingThread extends Thread{
	
	private BufferedReader input;
	private MessageListener messageListener;
	private boolean keepListening = true;
	
	public ReceivingThread(MessageListener listener, Socket socket){
		
		super ("ReceivingThread"+ socket);
		
		messageListener = listener;
		
		try{
			socket.setSoTimeout(5000);
			input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		}
		catch (IOException exp){
			exp.printStackTrace();
		}
	}
	
	public void run(){
		String message;
		
		//слушать сообщения, пока не остановлен
		while (keepListening){
			try {
				message = input.readLine();
			}
			catch (InterruptedIOException exp){
				//начать новую итерацию
				continue;
			}
			catch (IOException exp){
				exp.printStackTrace();
				break;
			}
			
			if (message != null){
				StringTokenizer tokenizer = new StringTokenizer(message,SocketMessengerConstants.MESSAGE_SEPARATOR);
				
				//игнорировать сообщения, не зодержащие имени пользователя, темы и текста
				if (tokenizer.countTokens() == 2){
					//послать сообщение на MessageListener
					messageListener.messageReceived(
							tokenizer.nextToken(),		//имя отправителя
							tokenizer.nextToken(),		//тема сообщения
							"");		//текст сообщения
				}
				else 
					//если принято сообщение DISCONNECT, остановить слушание
					if (message.equalsIgnoreCase(
							SocketMessengerConstants.MESSAGE_SEPARATOR+
							SocketMessengerConstants.DISCONNECT_STRING+
							SocketMessengerConstants.MESSAGE_SEPARATOR))
					{
						stopListening();
					}
			}
		}
		//закрыть BufferedReader
		try {
			input.close();
		}
		catch (IOException exp){
			exp.printStackTrace();
		}
	}
	
	public void stopListening(){
		keepListening = false;
	}

}
